<?php
class Szamlaegyenleg extends AppModel {

	var $name = 'Szamlaegyenleg';
	
	var $settings = null;	//a settings értékek a sessionből jönnek, így elérhetőek az osztályon belül

	//The Associations below have been created with all possible keys, those that are not needed can be removed
	var $belongsTo = array(
			'Szamla' => array('className' => 'Szamla',
								'foreignKey' => 'szamla_id',
								'conditions' => '',
								'fields' => '',
								'order' => ''
			),
			'Gyujto' => array('className' => 'Gyujto',
								'foreignKey' => 'ceg_id',
								'conditions' => '',
								'fields' => '',
								'order' => ''
			)
	);


/**
 * Egy számla egyenlegének módosítása normál bizonylat mentés esetén
 *
 * TODO: Ezt egy triggerrel is meg lehetne oldani
 *
 * a $tetel paraméternek az alábbi kulcsokat kell tartalmaznia
 * 		'osszeg' => 12000		//a tétel értéke az alapértelmezett valutában
 * 		't' => 125				//a tartozik számla id-je
 * 		'k' => 1547				//a követel számla id-je
 *			'osztalyId' => 1		//annak az osztálynak az id-je amiben a tétel történt
 *
 * @param array $tetel a könyvelt tétel a következő kulcsokkal
 * @param array $settings a sessionban tárol beállítások, mint cegId és ev
 * @return bool siker
 */
	function frissit($tetel, $settings){
	//$this->log('$tetel: ' . print_r($tetel, true), LOG_DEBUG);
/*
 debug($tetel);
 Array
(
    [osszeg] => 9000000
    [szoveg] => ue
    [sorszam] => 0
    [t] => 64
    [k] => 70
    [osztalyId] => 2
)

  */
		if((isset($tetel['spec']) && $tetel['spec'] != 'd') || !isset($tetel['spec'])){		//ha a tétel töröltnek van jelölve akkor változása nem változtatja az egyenleget
			if(is_numeric($tetel['osszeg']) && $tetel['t'] && $tetel['k'] && $tetel['osztalyId']){
				//a szamlaegyenlegek táblában csak azok a számlák szerepelnek amiken már volt mozgás
			
				//a céges egyenleget frissítjük először
				$tetel['aCeg'] = $settings['cegId'];
				//a tételben a tartozik számla
				$t = $this->find('first', array(
												'conditions'	=>	array(
																			'ceg_id'	=>	$settings['cegId'],
																			'ev'		=> $settings['ev'],
																			'szamla_id' => $tetel['t']
																			),
												'recursive'		=> -1
												));
				//debug($t);
				//$this->log(print_r($t, true), LOG_DEBUG);
				if(!$this->_mentes('t', $t, $tetel, $settings['ev']))
					return false;
			
				//a tételben a követel számla
				$k = $this->find('first', array(
												'conditions'	=>	array(
																			'ceg_id'	=>	$settings['cegId'],
																			'ev'		=> $settings['ev'],
																			'szamla_id' => $tetel['k']
																			),
												'recursive'		=> -1
												));
			
				//$this->log(print_r($k, true), LOG_DEBUG);
				if(!$this->_mentes('k', $k, $tetel, $settings['ev']))
					return false;
			
				//elmentettük a céges egyenleget mentsük az osztályét is
				$tetel['aCeg'] = 1;		//todo: HC az osztály egyenleget fogjuk menteni
				$t = $this->find('first', array(
												'conditions'	=>	array(
																			'ceg_id'	=>	1,	//todo: HC
																			'osztaly_id' => $tetel['osztalyId'],
																			'ev'		=> $settings['ev'],
																			'szamla_id' => $tetel['t']
																			),
												'recursive'		=> -1
												));
				if(!$this->_mentes('t', $t, $tetel, $settings['ev']))
					return false;
				$k = $this->find('first', array(
												'conditions'	=>	array(
																			'ceg_id'	=>	1,	//todo: HC
																			'osztaly_id' => $tetel['osztalyId'],
																			'ev'		=> $settings['ev'],
																			'szamla_id' => $tetel['k']
																			),
												'recursive'		=> -1
												));
				if(!$this->_mentes('k', $k, $tetel, $settings['ev']))
					return false;
			
			
				return true;
			}
			else{
				return false;
			}
		}
		else	//nem csináltunk semmit azaz minden jól ment
			return true;
	}
	
/**
 * Egy számla egyenlegének adatbázis beli mentése
 *
 * @param string $oldal 't' vagy 'k'
 * @param array $szamla a módosítandó egyenlegű számla rekordja a számlaegyenlegeket táblában
 * @param int $tetel a mentendő tétel
 * @param int $ev a könyvelési év
 * @return bool siker
 */
	function _mentes($oldal, $szamla = null, $tetel, $ev){
/*debug($oldal);
 t / k
debug($szamla);
Array
(
    [Szamlaegyenleg] => Array
        (
            [id] => 3
            [ceg_id] => 2
            [osztaly_id] => 1
            [szamla_id] => 64
            [ev] => 2009
            [tegyenleg] => 58405252.00
            [kegyenleg] => 7290010.00
        )

)



debug($tetel);
Array
(
    [osszeg] => 10000000
    [szoveg] => ue
    [sorszam] => 0
    [t] => 64
    [k] => 70
    [osztalyId] => 2
    [aCeg] => 1
)

*/
		$oldal = ($oldal == 't') ? 't' : 'k';
		//ha a $szamla tömböt nem kaptuk meg paraméterül akkor itt kell létrehozni, nem szerepel még az adat táblában
		if(!$szamla){
			$szamla = array(
					'Szamlaegyenleg' => array(
							'ceg_id'			=> $tetel['aCeg'],
							'osztaly_id' 	=> ($tetel['aCeg'] == 1) ? $tetel['osztalyId'] : 1,	//todo: HC ha a ceg_id 1 akkor osztály egyenlegről van szó ha nem akkor meg cégesről
							'ev' 				=> $ev,
							'szamla_id'		=> $tetel[$oldal],
							'tegyenleg'		=> 0,
							'kegyenleg'		=> 0
						)
					);
		}
		$szamla['Szamlaegyenleg'][$oldal.'egyenleg'] += $tetel['osszeg'];
		//az id-t be kell állítani máskülönben a k oldal felülírja a t-t
		$this->id = isset($szamla['Szamlaegyenleg']['id']) ? $szamla['Szamlaegyenleg']['id'] : null;
		//debug($szamla);
		/*$sz = $szamla;
		$sz['Szamlaegyenleg']['egyenleg'] = number_format(($sz['Szamlaegyenleg']['tegyenleg']-$sz['Szamlaegyenleg']['kegyenleg']), 0, '.', ',');
		$this->log('$szamla: ' . print_r($sz, true), LOG_DEBUG);*/
		if($this->save($szamla))		//a céges mentés sikeres volt
			return true;
		else
			return false;		//a céges mentés nem sikeres
	}

/**
 * Egy számla egyenlegének lekérdezése forintban
 *
 * @param int $szamlaId a számla aminek keressük az egyenlegét
 * @param int $ev melyik év egyenlegére vagyunk kíváncsiak
 * @param int $cegId a cég id je a gyujtok táblában - vagy céges vagy osztály
 * @param int $osztalyId az osztály id-je - vagy céges vagy osztály
 * @return array tegyenleg, kegyenleg
 */
	function getEgyenleg($szamlaId = null, $ev = null, $osztalyId = null, $cegId = null){
		if(!$szamlaId || !$ev)
			return false;
		$feltetel = array(
							'szamla_id' => $szamlaId,
							'ev' => $ev
							);
		//ha van osztalyId akkor arra vagyunk kiváncsiak mi az adott számla egyenlege az adott osztályra vonatkozóan
		if($osztalyId)
			$feltetel['osztaly_id'] = $osztalyId;
		//ha van $cegId akkor a céges számlaegyenlegre vagyunk kíváncsiak
		$cegId = $cegId ? $cegId : 1;	//todo: hardcoded nincs céges kód
		$feltetel['ceg_id'] = $cegId;
		$egyenleg = $this->find(
									'first',
									array(
										'fields' => array('tegyenleg', 'kegyenleg'),
										'conditions' => $feltetel,
										'recursive' => -1
									)
									);		
		//debug($egyenleg);
		return($egyenleg['Szamlaegyenleg']);
	}

}
?>